﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
   public class GestorCiudad
    {

       public static Ciudad Obtener(int OID)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "CIUDADES_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", OID);

               DataTable dt = repo.ExecuteDataTable();
               Ciudad result = dt.ToGenericList<Ciudad>(CiudadConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new CiudadGetException(ex);
           }
       }


       public static void Guardar(Ciudad ciudad)
       {

           //TODO:  Validar si vienen Ids de Prov y Zona y crear y lanzar excepcion si no se cumple.
              //if (ciudad.Provincia == null)  new Exception();
              //if (ciudad.Zona == null) new Exception();


           try
           {
               IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
               repo.Nombre = "CIUDADES_PROC";
               repo.AddParameter("@ACCION", ciudad.Persistencia);
               repo.AddParameter("@ID", ciudad.OID);
               repo.AddParameter("@CODIGO", ciudad.Codigo);
               repo.AddParameter("@NUMERO",0);
               repo.AddParameter("@NOMBRE", ciudad.Nombre);
               repo.AddParameter("@PROVINCIA", ciudad.Provincia.OID);
               repo.AddParameter("@ZONA", ciudad.Zona == null ? (int?)null : ciudad.Zona.OID);
               repo.AddParameter("@TARIFAVIATICO", ciudad.TarifaViatico);
               repo.AddParameter("@TARIFATERMINAL", ciudad.TarifaTerminal);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               ciudad.OID = repo.ExecuteReturnValue().ToInteger();

               repo.Commit();
               GestorBitacora.Guardar(ciudad);

           }
           catch (Exception ex)
           {
               throw new CiudadSaveException(ex);
           }
       }


       public static void Eliminar(Ciudad ciudad)
       {
           ciudad.Persistencia = EstadoPersistencia.DELETE;
           Guardar(ciudad);
           ciudad.Persistencia = EstadoPersistencia.UPDATE;
           ciudad.Activo = false;
       }
       public static void ReActivar(Ciudad ciudad)
       {
           ciudad.Persistencia = EstadoPersistencia.UNDELETE;
           Guardar(ciudad);
           ciudad.Persistencia = EstadoPersistencia.UPDATE;
           ciudad.Activo = true;
       }

       public static List<Ciudad> Consultar(string codigo, int? numero, string nombre, int? idProv, int? idZona, bool? activo)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
               repo.Nombre = "CIUDADES_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@CODIGO", codigo);
               repo.AddParameter("@NUMERO", numero);
               repo.AddParameter("@NOMBRE", nombre);
               repo.AddParameter("@PROVINCIA", idProv);
               repo.AddParameter("@ZONA", idZona);
               repo.AddParameter("@ACTIVO", activo);
               DataTable dt = repo.ExecuteDataTable();
               List<Ciudad> result = dt.ToGenericList<Ciudad>(CiudadConverter);
               return result;
           }
           catch (Exception ex)
           {
               throw new CiudadGetException(ex);
           }
       }
      
       public static List<Ciudad> Consultar()
       {
           return Consultar(null, null, null, null, null, null);
       }

       public static List<Ciudad> Consultar(string codigo, int? numero, string nombre, int? idProv, int? idZona)
       {
           return Consultar(codigo, numero, nombre, idProv, idZona, true);
       }

       public static List<Ciudad> Consultar(bool activo)
       {
           return Consultar(null, null, null, null, null, activo);
       }
       /// <summary>
       /// Descripcion : Consulta Ciudades por provincia.
       /// </summary>
       /// <param name="idProv"></param>
       /// <returns></returns>
       public static List<Ciudad> Consultar(int idProv)
       {
           return Consultar(null, null, null, idProv, null, true);
       
       }


       #region Converter
       public static Ciudad CiudadConverter(DataRow row)
       {
           return new Ciudad
           {
               OID = row["ciuID"].ToInteger(),
               Persistencia = EstadoPersistencia.UPDATE,
               Codigo = row["ciuCODIGO"].ToString(),
               Numero = row["ciuNUMERO"].ToInteger(),
               Nombre = row["ciuNOMBRE"].ToString(),
               TarifaViatico =  row["ciuTARIFAVIATICO"].ToDecimal(),
               TarifaTerminal = row["ciuTARIFATERMINAL"].ToDecimal(), 
               
               Provincia = GestorProvincia.Obtener(row["ciuIDPROVINCIA"].ToInteger()),
               Zona = GestorZona.Obtener(row["ciuIDZONA"].ToInteger()),

               Activo = row.IsNull("FECHA_BAJA") ? true : false
           };
       }
       #endregion


    }
}
